/* eslint-disable consistent-return */
const jwt = require("jsonwebtoken");
const log = require("./common");
/**
 * jwt config
 */
const jwtConfig = {
  jwtSecretKey: "token", // jwt加密的密钥
  expiresIn: "1h", // token过期时间
  LongExpiresIn: "7d",
};

/**
 * 解析token的中间件，获取用户的id
 */
function authenticateToken(req, res, next) {
  const authHeader = req.headers.authorization;
  if (!authHeader) {
    // 如果没有Authorization头，直接返回401，不调用next()
    return res.sendStatus(401);
  }
  const token = authHeader.split(" ")[1]; // 假设Bearer Token
  if (!token) {
    // 如果没有Token，同样直接返回401
    return res.sendStatus(401);
  }

  // 使用jwt.verify验证token
  try {
    const decoded = jwt.verify(token, jwtConfig.jwtSecretKey);
    req.userId = decoded.id; // 将用户ID添加到请求对象上
    next(); // 验证成功，调用next继续处理请求
  } catch (error) {
    // 令牌过期返回401，不调用next()
    if (error instanceof jwt.TokenExpiredError) {
      res.status(401).send("token过期");
      log.info("get userInfo failed");
    } else if (error instanceof jwt.JsonWebTokenError) {
      res.status(403).send("token无效");
      log.info("get userInfo failed");
    } else {
      // 其他错误
      res.status(500).send("An error occurred while verifying the token");
      log.error("An error occurred while verifying the token", error);
    }
  }
}

module.exports = {
  authenticateToken,
  jwtConfig,
};
